home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 55375 / 55375.xpi / chrome / chromeFiles / content / bindings / btfeedreader.xml < prev    next >
Encoding:
Extensible Markup Language  |  2009-11-15  |  13.7 KB  |  408 lines

  1. <?xml version="1.0"?>
  2.  
  3. <bindings id="feedreaderBindings"
  4.       xmlns="http://www.mozilla.org/xbl"
  5.       xmlns:html="http://www.w3.org/1999/xhtml"
  6.       xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  7.       xmlns:xbl="http://www.mozilla.org/xbl">
  8.  
  9.   <binding id="feedreader" extends="xul:box">
  10.     <content>
  11.       <xul:toolbaritem id="feedreader">
  12.         <xul:image id="feedreader-left-cap" />
  13.         <xul:button tooltiptext="Toggle News Sidebar" id="feedreader-sidebar-toggle" oncommand="toggleFeedSidebar()"/>
  14.         <xul:button tooltiptext="Reload Feed" id="feedreader-reload" xbl:inherits="hidden=hidereloadbutton" oncommand="readFeed()"/>
  15.         <xul:button tooltiptext="Previous Item" id="feedreader-previous" oncommand="previousFeedItem()"/>
  16.         <xul:button tooltiptext="Next Item" id="feedreader-next" oncommand="nextFeedItem()"/>
  17.         <xul:button id="feedreader-feedname" xbl:inherits="hidden=hidefeedname" oncommand="nextFeed()"/>
  18.         <xul:hbox id="feedreader-textbox" disabled="true" xbl:inherits="width">
  19.           <xul:deck id="feedreader-deck" min-width="100" flex="1" crop="end">
  20.             <xul:hbox>
  21.               <xul:label id="feedreader-loading" value="Loading..." />
  22.             </xul:hbox>
  23.           </xul:deck>
  24.         </xul:hbox>
  25.         <xul:image id="feedreader-right-cap" />
  26.       </xul:toolbaritem>
  27.       <children includes="btfeed" />
  28.     </content>
  29.     <handlers>
  30.       <handler event="command">
  31.         <![CDATA[
  32.         if (event.originalTarget.hasAttribute("url")) {
  33.           var subject = {};
  34.           subject.wrappedJSObject = this.brandObject;
  35.           this.observerService.notifyObservers(subject, "brandthunder", this.id);
  36.           this.brandObject.utilities.openLink(this.brandObject, event, event.originalTarget.getAttribute("url"));
  37.         }
  38.         ]]>
  39.       </handler>
  40.     </handlers>
  41.     <implementation>
  42.       <constructor>
  43.         <![CDATA[
  44.         if (this.childNodes.length) {
  45.           for (var i=0; i < this.childNodes.length; i++) {
  46.             this.feeds.push(this.childNodes[i].getAttribute('src'));
  47.           }
  48.           if (this.childNodes.length == 1 ) { 
  49.             document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').setAttribute('disabled', true);
  50.           }
  51.         } else {
  52.           return;
  53.         }
  54.  
  55.         this.observerService = Components.classes["@mozilla.org/observer-service;1"]
  56.                                          .getService(Components.interfaces.nsIObserverService)
  57.  
  58.         var title = this.childNodes[0].getAttribute('title');
  59.         if (title) {
  60.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').label = title;
  61.         } else {
  62.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').hidden = true;
  63.         }
  64.         if (this.hasAttribute('brand')) {
  65.           this.brandObject = BrandThunder.clients[this.getAttribute('brand')];
  66.         }
  67.         if (this.hasAttribute('numitems')) {
  68.           this.numitems = this.getAttribute('numitems');
  69.         }
  70.         if (this.hasAttribute('rotationdelay')) {
  71.           this.rotationdelay = this.getAttribute('rotationdelay') * 1000;
  72.         }
  73.         if (this.hasAttribute('itemtitleprefix')) {
  74.           this.itemtitleprefix = this.getAttribute('itemtitleprefix');
  75.         }
  76.         if (this.hasAttribute('itemurlprefix')) {
  77.           this.itemurlprefix = this.getAttribute('itemurlprefix');
  78.         }
  79.         if (this.hasAttribute('sidebar')) {
  80.           this.sidebarID = this.getAttribute('sidebar');
  81.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('observes', this.sidebarID);
  82.         } else {
  83.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('hidden', true);
  84.         }
  85.  
  86.         this.readFeed(this.selectedIndex);
  87.         function reloadFeed(feedreader) {
  88.           return function() {
  89.             feedreader.readFeed(0, feedreader);
  90.           }
  91.         }
  92.         this.reloadTimer = window.setInterval(reloadFeed(this), this.reloaddelay);
  93.         ]]>
  94.       </constructor>
  95.       <destructor>
  96.           window.clearInterval(this.rotationTimer);
  97.           window.clearInterval(this.reloadTimer);
  98.       </destructor>
  99.       <field name="feeds">
  100.         [];
  101.       </field>
  102.       <field name="feedItems">
  103.         [];
  104.       </field>
  105.       <field name="numitems">
  106.         -1;
  107.       </field>
  108.       <field name="feedIndex">
  109.         0;
  110.       </field>
  111.       <field name="selectedIndex">
  112.         0;
  113.       </field>
  114.       <field name="rotationdelay">
  115.         5000;
  116.       </field>
  117.       <field name="reloaddelay">
  118.         1800000;
  119.       </field>
  120.       <field name="itemtitleprefix">
  121.         "";
  122.       </field>
  123.       <field name="itemurlprefix">
  124.         "";
  125.       </field>
  126.       <field name="currentFeedTitle">
  127.         "";
  128.       </field>
  129.       <field name="currentFeedURL">
  130.         "";
  131.       </field>
  132.       <field name="rssdeckElement">
  133.         document.getAnonymousElementByAttribute(this, 'id', 'feedreader-deck');
  134.       </field>
  135.       <field name="rotationTimer">
  136.       </field>
  137.       <field name="reloadTimer">
  138.       </field>
  139.       <field name="readSrcTimer">
  140.       </field>
  141.       <field name="sidebarID">
  142.         ""
  143.       </field>
  144.       <field name="brandObject"/>
  145.       <field name="observerService"/>
  146.  
  147.  
  148.       <method name="toggleFeedSidebar">
  149.         <body>
  150.           <![CDATA[
  151.           if (this.sidebarID) {
  152.             toggleSidebar(this.sidebarID);
  153.           }
  154.           ]]>
  155.         </body>
  156.       </method>
  157.  
  158.       <method name="startFeedRotation">
  159.         <body>
  160.           <![CDATA[
  161.           var deckLength = this.rssdeckElement.childNodes.length;
  162.           window.clearInterval(this.rotationTimer);
  163.           function advance(feedreader) {
  164.             return function() {
  165.               feedreader.nextFeedItem();
  166.             }
  167.           }
  168.           this.rotationTimer = window.setInterval(advance(this), this.rotationdelay);
  169.           ]]>
  170.         </body>
  171.       </method>
  172.       <method name="previousFeedItem">
  173.         <body>
  174.           <![CDATA[
  175.           this.startFeedRotation();
  176.           var deckLength = this.rssdeckElement.childNodes.length;
  177.  
  178.           var selectedIndex = parseInt(this.rssdeckElement.getAttribute('selectedIndex'));
  179.           if (selectedIndex > 0) {
  180.             this.rssdeckElement.setAttribute('selectedIndex', selectedIndex - 1);
  181.           } else {
  182.             this.rssdeckElement.setAttribute('selectedIndex', deckLength - 1);
  183.           }
  184.  
  185.           ]]>
  186.         </body>
  187.       </method>
  188.  
  189.       <method name="nextFeedItem">
  190.         <body>
  191.           <![CDATA[
  192.           this.startFeedRotation();
  193.           var deckLength = this.rssdeckElement.childNodes.length;
  194.  
  195.           var selectedIndex = parseInt(this.rssdeckElement.getAttribute('selectedIndex'));
  196.           if (selectedIndex < deckLength - 1) {
  197.             this.rssdeckElement.setAttribute('selectedIndex', selectedIndex + 1);
  198.           } else {
  199.             this.rssdeckElement.setAttribute('selectedIndex', 0);
  200.           }
  201.  
  202.           ]]>
  203.         </body>
  204.       </method>
  205.       <method name="nextFeed">
  206.         <body>
  207.           <![CDATA[
  208.           window.clearInterval(this.rotationTimer);
  209.           this.feedIndex++;
  210.           if (this.feedIndex == this.childNodes.length) {
  211.             this.feedIndex = 0;
  212.           }
  213.  
  214.         var title = this.childNodes[this.feedIndex].getAttribute('title');
  215.  
  216.         if (title) {
  217.           document.getAnonymousElementByAttribute(this, 'id', 'feedreader-feedname').label = title;
  218.         }
  219.  
  220.           this.readFeed();
  221.  
  222.           ]]>
  223.         </body>
  224.       </method>
  225.       <method name="readFeed">
  226.         <parameter name="index" />
  227.         <parameter name="feedreader" />
  228.         <body>
  229.           if (!feedreader) {
  230.             feedreader = this;
  231.           }
  232.           <![CDATA[
  233.           if (!index) {
  234.             index = feedreader.feedIndex;
  235.           }
  236.           feedreader.feedItems = [];
  237.  
  238.           var xhr = new XMLHttpRequest();
  239.           xhr.open('GET', feedreader.feeds[index], true);
  240.           xhr.onload = function() {
  241.             feedreader.parseFeed(xhr.responseText);
  242.           }
  243.           xhr.send(null);
  244.           ]]>
  245.         </body>
  246.       </method>
  247.       <method name="parseFeed">
  248.         <parameter name="xml" />
  249.         <body>
  250.           <![CDATA[
  251.           var parser = new DOMParser();
  252.           var dom = parser.parseFromString(xml, 'text/xml');
  253.  
  254.           // check for error
  255.           if (dom.documentElement.nodeName == 'parsererror')
  256.             throw new Error('Could not parse feed');
  257.  
  258.           var xmlDoc = dom.documentElement;
  259.           switch (xmlDoc.nodeName.toLowerCase()) {
  260.             case 'feed':    this.parseAtom(xmlDoc); break;
  261.             case 'rdf:rdf': this.parseRss(xmlDoc); break;
  262.             case 'rss':     this.parseRss(xmlDoc); break;
  263.           }
  264.  
  265.         this.loadFeedDisplay();
  266.  
  267.           ]]>
  268.         </body>
  269.       </method>
  270.  
  271.       <method name="loadFeedDisplay">
  272.         <body>
  273.           <![CDATA[
  274.           for (var deckChildren = this.rssdeckElement.childNodes.length - 1; deckChildren >= 0; deckChildren--) {
  275.             this.rssdeckElement.removeChild(this.rssdeckElement.childNodes.item(deckChildren));
  276.           }
  277.  
  278.           var numFeedItems = this.feedItems.length;
  279.           if (this.numitems > 0) {
  280.             numFeedItems = this.numitems;
  281.           }
  282.           for (var i = 0; i < numFeedItems; i++) {
  283.             var tempButton = document.createElement('toolbarbutton');
  284.             tempButton.setAttribute('crop', 'end');
  285.             tempButton.setAttribute('pack', 'start');
  286.             tempButton.setAttribute('label', this.itemtitleprefix + this.feedItems[i]['title']);
  287.             tempButton.setAttribute('tooltiptext', this.feedItems[i]['title']);
  288.             tempButton.setAttribute('crop', 'end');
  289.             tempButton.setAttribute('flex', '2');
  290.  
  291.             // Set the link
  292.             if (this.itemurlprefix) {
  293.               var url = this.itemurlprefix + escape(this.feedItems[i]['url']).replace(/\'/g, "\\\'" );
  294.             } else {
  295.               var url = this.feedItems[i]['url'];
  296.             }
  297.             tempButton.setAttribute('url', url);
  298.  
  299.             this.rssdeckElement.appendChild(tempButton);
  300.           }
  301.  
  302.           this.rssdeckElement.setAttribute('selectedIndex', 0);
  303.  
  304.           this.startFeedRotation();
  305.  
  306.  
  307.           ]]>
  308.         </body>
  309.       </method>
  310.  
  311.       <method name="parseAtom">
  312.         <parameter name="xmlDoc" />
  313.         <body>
  314.           <![CDATA[
  315.             var kids = xmlDoc.childNodes;
  316.             for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'title') {
  317.               this.currentFeedTitle = kids[i].textContent;
  318.               break;
  319.             }
  320.             for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'link') {
  321.               var rel = kids[i].getAttribute('rel');
  322.               if (rel == null || rel == 'alternate') {
  323.                 this.currentFeedURL = kids[i].getAttribute('href');
  324.                 break;
  325.               }
  326.             }
  327.  
  328.             var entries = xmlDoc.getElementsByTagName('entry');
  329.             for (var i = 0; i < entries.length; i++) {
  330.               this.feedItems[i] = ['title', 'url'];
  331.  
  332.               //load the entry title
  333.               this.feedItems[i]['title'] = entries[i].getElementsByTagName('title')[0].firstChild.nodeValue;
  334.  
  335.               //if <id> is an absolute URL, use that
  336.               var elem = entries[i].getElementsByTagName('id');
  337.               for (var j = 0; j < elem.length; j++) {
  338.                 var kids = elem[j].childNodes;
  339.                 if (kids.length > 0) {
  340.                   var val = kids[0].nodeValue;
  341.                   if (val != null && val.match(/^http:\/\//)) {
  342.                     this.feedItems[i]['url'] = val;
  343.                     break;
  344.                   }
  345.                 }
  346.               }
  347.  
  348.  
  349.               //instead look for a <link> tag
  350.               if (this.feedItems[i]['url'] == null) {
  351.                 var elem = entries[i].getElementsByTagName('link');
  352.                 for (var j = 0; j < elem.length; j++) {
  353.                   var rel = elem[j].getAttribute('rel');
  354.                   if (rel == null || rel == 'alternate') {
  355.                     this.feedItems[i]['url'] = elem[j].getAttribute('href');
  356.                     break;
  357.                   }
  358.                 }
  359.               }
  360.  
  361.               if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
  362.                 throw new Error('Invalid feed');
  363.             }
  364.  
  365.           ]]>
  366.         </body>
  367.       </method>
  368.       <method name="parseRss">
  369.         <parameter name="xmlDoc" />
  370.         <body>
  371.           <![CDATA[
  372.           var channels = xmlDoc.getElementsByTagName('channel');
  373.           if (channels.length > 0) {
  374.             var kids = channels[0].childNodes;
  375.             for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'title') {
  376.               this.currentFeedTitle = kids[i].textContent;
  377.               break;
  378.             }
  379.             for (var i = 0; i < kids.length; i++) if (kids[i].nodeName == 'link') {
  380.               this.currentFeedURL = kids[i].textContent;
  381.               break;
  382.             }
  383.           }
  384.  
  385.           var items = xmlDoc.getElementsByTagName('item');
  386.           for (var i = 0; i < items.length; i++) {
  387.             this.feedItems[i] = ['title', 'url', 'content'];
  388.  
  389.             var titleElem = items[i].getElementsByTagName('title');
  390.             if (titleElem.length > 0)
  391.               this.feedItems[i]['title'] = titleElem[0].textContent;
  392.  
  393.             var linkElem = items[i].getElementsByTagName('link');
  394.             if (linkElem.length > 0)
  395.               this.feedItems[i]['url'] = linkElem[0].textContent;
  396.  
  397.             if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
  398.               throw new Error('Invalid feed');
  399.           }
  400.           ]]>
  401.         </body>
  402.       </method>
  403.     </implementation>
  404.   </binding>
  405.  
  406.   <binding id="feed"></binding>
  407. </bindings>
  408.